Scrapboxのページの差分書き換えテスト (code)
code:app.js
const version="4.2.0";async function socketIO(){return(await importSocketIO())("https://scrapbox.io",{reconnectionDelay:5e3,transports:["websocket"]})}function importSocketIO(){const t=https://cdnjs.cloudflare.com/ajax/libs/socket.io/${version}/socket.io.min.js;if(document.querySelector(script[src="${t}"]))return Promise.resolve(window.io);const e=document.createElement("script");return e.src=t,new Promise((o,r)=>{e.onload=()=>o(window.io),e.onerror=n=>r(n),document.head.append(e)})}function wrap(t,e=9e4){function o(n,i){let c;return new Promise((l,d)=>{const u=s=>{clearTimeout(c),d(new Error(s))};t.emit(n,i,s=>{clearTimeout(c),t.off("disconnect",u),s.error&&d(new Error(JSON.stringify(s.error))),"data"in s?l(s?.data):l(void 0)}),c=setTimeout(()=>{t.off("disconnect",u),d(new Error(Timeout: exceeded ${e}ms))},e),t.once("disconnect",u)})}async function*r(n){let i;const c=()=>new Promise(d=>i=d),l=d=>{i?.(d)};t.on(n,l);try{for(;;)yield await c()}finally{t.off(n,l)}}return{request:o,response:r}}function toTitleLc(t){return t.replaceAll(" ","_").toLowerCase()}async function getPage(t,e){const o=await fetch(https://scrapbox.io/api/pages/${t}/${encodeURIComponent(toTitleLc(e))});if(!o.ok)throw Error(await o.text());return await o.json()}async function getUserId(){const e=await(await fetch("https://scrapbox.io/api/users/me")).json();if(e.isGuest)throw new Error("this script can only be executed by Logged in users");return e.id}function zero(t){return t.padStart(8,"0")}function createNewLineId(t){const e=Math.floor(new Date().getTime()/1e3).toString(16),o=Math.floor(16777214*Math.random()).toString(16);return${zero(e).slice(-8)}${t.slice(-6)}0000${zero(o)}}async function getPageIdAndCommitId(t,e){const{id:o,commitId:r,persistent:n}=await getPage(t,e);return{pageId:o,commitId:r,persistent:n}}async function getProjectId(t){return(await(await fetch(https://scrapbox.io/api/projects/${t})).json()).id}function diff(t,e){const o=t.length>e.length,r=o?e:t,n=o?t:e,i=r.length+1,c=r.length+n.length+3,l=new Array(c);l.fill(-1);const d=[];function u(a,h,g){let y=Math.max(h,g),x=y-a;for(;x<r.length&&y<n.length&&rx===ny;)++x,++y;return la+i=d.length,d.push([{x,y},la+(h>g?-1:1)+i]),y}const s=new Array(c);s.fill(-1);let w=-1;const f=n.length-r.length;do{++w;for(let a=-w;a<=f-1;++a)sa+i=u(a,sa-1+i+1,sa+1+i);for(let a=f+w;a>=f+1;--a)sa+i=u(a,sa-1+i+1,sa+1+i);sf+i=u(f,sf-1+i+1,sf+1+i)}while(sf+i!==n.length);const m=[];let p=lf+i;for(;p!==-1;)m.push(dp0),p=dp1;return{from:t,to:e,editDistance:f+w*2,buildSES:function*(){let a=0,h=0;for(const{x:g,y}of reverse(m))for(;a<g||h<y;)y-g>h-a?(yield{value:nh,type:o?"deleted":"added"},++h):y-g<h-a?(yield{value:ra,type:o?"added":"deleted"},++a):(yield{value:ra,type:"common"},++a,++h)}}}function*toExtendedChanges(t){let e=[],o=[];function*r(){if(e.length>o.length){for(let n=0;n<o.length;n++)yield makeReplaced(en,on);for(let n=o.length;n<e.length;n++)yield en}else{for(let n=0;n<e.length;n++)yield makeReplaced(en,on);for(let n=e.length;n<o.length;n++)yield on}e=[],o=[]}for(const n of t)switch(n.type){case"added":e.push(n);break;case"deleted":o.push(n);break;case"common":yield*r(),yield n;break}yield*r()}function makeReplaced(t,e){return{value:t.value,oldValue:e.value,type:"replaced"}}function*reverse(t){for(let e=t.length-1;e>=0;e--)yield te}function*diffToChanges(t,e,{userId:o}){const{buildSES:r}=diff(t.map(({text:c})=>c),e);let n=0,i=t0.id;for(const c of toExtendedChanges(r())){switch(c.type){case"added":yield{_insert:i,lines:{id:createNewLineId(o),text:c.value}};continue;case"deleted":yield{_delete:i,lines:-1};break;case"replaced":yield{_update:i,lines:{text:c.value}};break}n++,i=tn?.id??"_end"}}async function joinPageRoom(t,e){const{pageId:o,commitId:r,persistent:n},i,c=await Promise.all(getPageIdAndCommitId(t,e),getProjectId(t),getUserId());let l=r,d=n;const u=await socketIO(),{request:s,response:w}=wrap(u);await s("socket.io-request",{method:"room:join",data:{projectId:i,pageId:o,projectUpdatesStream:!1}}),(async()=>{for await(const{id:m}of w("commit"))l=m})();async function f(m,p=3){d||(l=(await pushCommit(s,{title:e},{parentId:l,projectId:i,pageId:o,userId:c})).commitId,d=!0),l=await pushWithRetry(s,m,{parentId:l,projectId:i,pageId:o,userId:c,project:t,title:e,retry:p})}return{insert:async(m,p="_end")=>{const a=m.split(/\n|\r\n/).map(h=>({_insert:p,lines:{text:h,id:createNewLineId(c)}}));await f(a)},remove:m=>f({_delete:m,lines:-1}),update:(m,p)=>f({_update:p,lines:{text:m}}),patch:async m=>{const p=(await getPage(t,e)).lines,a=m(p),h=...diffToChanges(p,a,{userId:c});await f(h)},listenPageUpdate:()=>w("commit"),cleanup:()=>u.disconnect()}}async function pushCommit(t,e,{projectId:o,pageId:r,userId:n,parentId:i}){return e.length===0?{commitId:i}:await t("socket.io-request",{method:"commit",data:{kind:"page",projectId:o,parentId:i,pageId:r,userId:n,changes:e,cursor:null,freeze:!0}})}async function pushWithRetry(t,e,{projectId:o,pageId:r,userId:n,parentId:i,project:c,title:l,retry:d=3}){try{i=(await pushCommit(t,e,{parentId:i,projectId:o,pageId:r,userId:n})).commitId}catch(u){console.log("Faild to push a commit. Retry after pulling new commits");for(let s=0;s<d;s++)try{i=(await getPageIdAndCommitId(c,l)).commitId,i=(await pushCommit(t,e,{parentId:i,projectId:o,pageId:r,userId:n})).commitId,console.log("Success in retrying");break}catch(w){continue}throw Error("Faild to retry pushing.")}return i}function throttle(t,e){const{trailing:o=!1}=e??{};let r,n=!1;const i=()=>r?.resolve?.({executed:!1}),c=async()=>{if(n||!r)return;n=!0;const{parameters:l,resolve:d,reject:u}=r;r=void 0;try{const s=await t(...l);n=!1,d({result:s,executed:!0})}catch(s){n=!1,u(s)}finally{o?await c():(i(),await Promise.resolve())}};return(...l)=>new Promise((d,u)=>{r?.resolve?.({executed:!1}),r={parameters:l,resolve:d,reject:u},c()})}const project="takker",title="\u5DEE\u5206\u66F8\u304D\u8FBC\u307F\u30C6\u30B9\u30C8\u7528\u30DA\u30FC\u30B8",div=document.createElement("div"),shadowRoot=div.attachShadow({mode:"open"});shadowRoot.innerHTML=` <style>
:host {
position: fixed;
left: 0;
bottom: 0;
z-index: 9999;
text-decoration: none;
background-color: var(--page-bg);
color: var(--page-text-color);
border: solid 1px var(--telomere-unread);
border-radius: 4px;
padding: 8px;
margin: 10px;
}
button {
display: inline-block;
}
</style>
<div>
<button id="button">x</button>
<span id="title"></span>
</div>
<textarea id="editor"></textarea>
,document.body.append(div);const{patch,cleanup}=await joinPageRoom(project,title);console.info("Connected to scrapbox.io");const editor=shadowRoot.getElementById("editor"),update=t=>patch(([e])=>[e.text,...t.split(/\n|\r\n/)]),callback=throttle(update,{trailing:!0});editor.addEventListener("input",()=>callback(editor.value)),console.info("Start patching"),shadowRoot.getElementById("title").insertAdjacentHTML("beforeend",<a href="${/${project}/${title}}" target="_blank">${/${project}/${title}}</a>`),shadowRoot.getElementById("button").onclick=()=>{console.info("End patching"),cleanup(),div.remove()};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiY29uc3QgdmVyc2lvbiA9IFwiNC4yLjBcIjtcbmFzeW5jIGZ1bmN0aW9uIHNvY2tldElPKCkge1xuICAgIGNvbnN0IGlvID0gYXdhaXQgaW1wb3J0U29ja2V0SU8oKTtcbiAgICByZXR1cm4gaW8oXCJodHRwczovL3NjcmFwYm94LmlvXCIsIHtcbiAgICAgICAgcmVjb25uZWN0aW9uRGVsYXk6IDUwMDAsXG4gICAgICAgIHRyYW5zcG9ydHM6IFtcbiAgICAgICAgICAgIFwid2Vic29ja2V0XCJcbiAgICAgICAgXVxuICAgIH0pO1xufVxuZnVuY3Rpb24gaW1wb3J0U29ja2V0SU8oKSB7XG4gICAgY29uc3QgdXJsID0gYGh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3NvY2tldC5pby8ke3ZlcnNpb259L3NvY2tldC5pby5taW4uanNgO1xuICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBzY3JpcHRbc3JjPVwiJHt1cmx9XCJdYCkpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh3aW5kb3cuaW8pO1xuICAgIH1cbiAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuICAgIHNjcmlwdC5zcmMgPSB1cmw7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpPT57XG4gICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKT0+cmVzb2x2ZSh3aW5kb3cuaW8pXG4gICAgICAgIDtcbiAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoZSk9PnJlamVjdChlKVxuICAgICAgICA7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kKHNjcmlwdCk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiB3cmFwKHNvY2tldCwgdGltZW91dCA9IDkwMDAwKSB7XG4gICAgZnVuY3Rpb24gcmVxdWVzdChldmVudCwgZGF0YSkge1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+e1xuICAgICAgICAgICAgY29uc3Qgb25EaXNjb25uZWN0ID0gKG1lc3NhZ2UpPT57XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzb2NrZXQuZW1pdChldmVudCwgZGF0YSwgKHJlc3BvbnNlKT0+e1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChpZCk7XG4gICAgICAgICAgICAgICAgc29ja2V0Lm9mZihcImRpc2Nvbm5lY3RcIiwgb25EaXNjb25uZWN0KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShyZXNwb25zZS5lcnJvcikpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFwiZGF0YVwiIGluIHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2U/LmRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlkID0gc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAgICAgICAgIHNvY2tldC5vZmYoXCJkaXNjb25uZWN0XCIsIG9uRGlzY29ubmVjdCk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGltZW91dDogZXhjZWVkZWQgJHt0aW1lb3V0fW1zYCkpO1xuICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgICAgICBzb2NrZXQub25jZShcImRpc2Nvbm5lY3RcIiwgb25EaXNjb25uZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGZ1bmN0aW9uKiByZXNwb25zZShldmVudCkge1xuICAgICAgICBsZXQgX3Jlc29sdmU7XG4gICAgICAgIGNvbnN0IHdhaXRGb3JFdmVudCA9ICgpPT5uZXcgUHJvbWlzZSgocmVzKT0+X3Jlc29sdmUgPSByZXNcbiAgICAgICAgICAgIClcbiAgICAgICAgO1xuICAgICAgICBjb25zdCByZXNvbHZlID0gKGRhdGEpPT57XG4gICAgICAgICAgICBfcmVzb2x2ZT8uKGRhdGEpO1xuICAgICAgICB9O1xuICAgICAgICBzb2NrZXQub24oZXZlbnQsIHJlc29sdmUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2hpbGUodHJ1ZSl7XG4gICAgICAgICAgICAgICAgeWllbGQgYXdhaXQgd2FpdEZvckV2ZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseXtcbiAgICAgICAgICAgIHNvY2tldC5vZmYoZXZlbnQsIHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJlcXVlc3QsXG4gICAgICAgIHJlc3BvbnNlXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRvVGl0bGVMYyh0aXRsZSkge1xuICAgIHJldHVybiB0aXRsZS5yZXBsYWNlQWxsKFwiIFwiLCBcIl9cIikudG9Mb3dlckNhc2UoKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGdldFBhZ2UocHJvamVjdCwgdGl0bGUpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9zY3JhcGJveC5pby9hcGkvcGFnZXMvJHtwcm9qZWN0fS8ke2VuY29kZVVSSUNvbXBvbmVudCh0b1RpdGxlTGModGl0bGUpKX1gKTtcbiAgICBpZiAoIXJlcy5vaykgdGhyb3cgRXJyb3IoYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgcmV0dXJuIGF3YWl0IHJlcy5qc29uKCk7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRVc2VySWQoKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXCJodHRwczovL3NjcmFwYm94LmlvL2FwaS91c2Vycy9tZVwiKTtcbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICBpZiAoanNvbi5pc0d1ZXN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoaXMgc2NyaXB0IGNhbiBvbmx5IGJlIGV4ZWN1dGVkIGJ5IExvZ2dlZCBpbiB1c2Vyc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIGpzb24uaWQ7XG59XG5mdW5jdGlvbiB6ZXJvKG4pIHtcbiAgICByZXR1cm4gbi5wYWRTdGFydCg4LCBcIjBcIik7XG59XG5mdW5jdGlvbiBjcmVhdGVOZXdMaW5lSWQodXNlcklkKSB7XG4gICAgY29uc3QgdGltZSA9IE1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKS50b1N0cmluZygxNik7XG4gICAgY29uc3QgcmFuZCA9IE1hdGguZmxvb3IoMTY3NzcyMTQgKiBNYXRoLnJhbmRvbSgpKS50b1N0cmluZygxNik7XG4gICAgcmV0dXJuIGAke3plcm8odGltZSkuc2xpY2UoLTgpfSR7dXNlcklkLnNsaWNlKC02KX0wMDAwJHt6ZXJvKHJhbmQpfWA7XG59XG5hc3luYyBmdW5jdGlvbiBnZXRQYWdlSWRBbmRDb21taXRJZChwcm9qZWN0LCB0aXRsZSkge1xuICAgIGNvbnN0IHsgaWQgLCBjb21taXRJZCAsIHBlcnNpc3RlbnQgIH0gPSBhd2FpdCBnZXRQYWdlKHByb2plY3QsIHRpdGxlKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwYWdlSWQ6IGlkLFxuICAgICAgICBjb21taXRJZCxcbiAgICAgICAgcGVyc2lzdGVudFxuICAgIH07XG59XG5hc3luYyBmdW5jdGlvbiBnZXRQcm9qZWN0SWQocHJvamVjdCkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwczovL3NjcmFwYm94LmlvL2FwaS9wcm9qZWN0cy8ke3Byb2plY3R9YCk7XG4gICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgcmV0dXJuIGpzb24uaWQ7XG59XG5mdW5jdGlvbiBkaWZmKGxlZnQsIHJpZ2h0KSB7XG4gICAgY29uc3QgcmV2ZXJzZWQgPSBsZWZ0Lmxlbmd0aCA+IHJpZ2h0Lmxlbmd0aDtcbiAgICBjb25zdCBhID0gcmV2ZXJzZWQgPyByaWdodCA6IGxlZnQ7XG4gICAgY29uc3QgYiA9IHJldmVyc2VkID8gbGVmdCA6IHJpZ2h0O1xuICAgIGNvbnN0IG9mZnNldCA9IGEubGVuZ3RoICsgMTtcbiAgICBjb25zdCBNQVhTSVpFID0gYS5sZW5ndGggKyBiLmxlbmd0aCArIDM7XG4gICAgY29uc3QgcGF0aCA9IG5ldyBBcnJheShNQVhTSVpFKTtcbiAgICBwYXRoLmZpbGwoLTEpO1xuICAgIGNvbnN0IHBhdGhwb3MgPSBbXTtcbiAgICBmdW5jdGlvbiBzbmFrZShrLCBwLCBwcCkge1xuICAgICAgICBsZXQgeSA9IE1hdGgubWF4KHAsIHBwKTtcbiAgICAgICAgbGV0IHggPSB5IC0gaztcbiAgICAgICAgd2hpbGUoeCA8IGEubGVuZ3RoICYmIHkgPCBiLmxlbmd0aCAmJiBhW3hdID09PSBiW3ldKXtcbiAgICAgICAgICAgICsreDtcbiAgICAgICAgICAgICsreTtcbiAgICAgICAgfVxuICAgICAgICBwYXRoW2sgKyBvZmZzZXRdID0gcGF0aHBvcy5sZW5ndGg7XG4gICAgICAgIHBhdGhwb3MucHVzaChbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgICB5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aFtrICsgKHAgPiBwcCA/IC0xIDogKzEpICsgb2Zmc2V0XVxuICAgICAgICBdKTtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgfVxuICAgIGNvbnN0IGZwID0gbmV3IEFycmF5KE1BWFNJWkUpO1xuICAgIGZwLmZpbGwoLTEpO1xuICAgIGxldCBwID0gLTE7XG4gICAgY29uc3QgZGVsdGEgPSBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgIGRvIHtcbiAgICAgICAgKytwO1xuICAgICAgICBmb3IobGV0IGsgPSAtcDsgayA8PSBkZWx0YSAtIDE7ICsrayl7XG4gICAgICAgICAgICBmcFtrICsgb2Zmc2V0XSA9IHNuYWtlKGssIGZwW2sgLSAxICsgb2Zmc2V0XSArIDEsIGZwW2sgKyAxICsgb2Zmc2V0XSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGxldCBrMSA9IGRlbHRhICsgcDsgazEgPj0gZGVsdGEgKyAxOyAtLWsxKXtcbiAgICAgICAgICAgIGZwW2sxICsgb2Zmc2V0XSA9IHNuYWtlKGsxLCBmcFtrMSAtIDEgKyBvZmZzZXRdICsgMSwgZnBbazEgKyAxICsgb2Zmc2V0XSk7XG4gICAgICAgIH1cbiAgICAgICAgZnBbZGVsdGEgKyBvZmZzZXRdID0gc25ha2UoZGVsdGEsIGZwW2RlbHRhIC0gMSArIG9mZnNldF0gKyAxLCBmcFtkZWx0YSArIDEgKyBvZmZzZXRdKTtcbiAgICB9d2hpbGUgKGZwW2RlbHRhICsgb2Zmc2V0XSAhPT0gYi5sZW5ndGgpXG4gICAgY29uc3QgZXBjID0gW107XG4gICAgbGV0IHIgPSBwYXRoW2RlbHRhICsgb2Zmc2V0XTtcbiAgICB3aGlsZShyICE9PSAtMSl7XG4gICAgICAgIGVwYy5wdXNoKHBhdGhwb3Nbcl1bMF0pO1xuICAgICAgICByID0gcGF0aHBvc1tyXVsxXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbTogbGVmdCxcbiAgICAgICAgdG86IHJpZ2h0LFxuICAgICAgICBlZGl0RGlzdGFuY2U6IGRlbHRhICsgcCAqIDIsXG4gICAgICAgIGJ1aWxkU0VTOiBmdW5jdGlvbiooKSB7XG4gICAgICAgICAgICBsZXQgeEluZGV4ID0gMDtcbiAgICAgICAgICAgIGxldCB5SW5kZXggPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IHggLCB5ICB9IG9mIHJldmVyc2UoZXBjKSl7XG4gICAgICAgICAgICAgICAgd2hpbGUoeEluZGV4IDwgeCB8fCB5SW5kZXggPCB5KXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHkgLSB4ID4geUluZGV4IC0geEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGJbeUluZGV4XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiByZXZlcnNlZCA/IFwiZGVsZXRlZFwiIDogXCJhZGRlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgKyt5SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSAtIHggPCB5SW5kZXggLSB4SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYVt4SW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHJldmVyc2VkID8gXCJhZGRlZFwiIDogXCJkZWxldGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICArK3hJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYVt4SW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY29tbW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICArK3hJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICsreUluZGV4O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uKiB0b0V4dGVuZGVkQ2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgbGV0IGFkZGVkTGlzdCA9IFtdO1xuICAgIGxldCBkZWxldGVkTGlzdCA9IFtdO1xuICAgIGZ1bmN0aW9uKiBmbHVzaCgpIHtcbiAgICAgICAgaWYgKGFkZGVkTGlzdC5sZW5ndGggPiBkZWxldGVkTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBkZWxldGVkTGlzdC5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgeWllbGQgbWFrZVJlcGxhY2VkKGFkZGVkTGlzdFtpXSwgZGVsZXRlZExpc3RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yKGxldCBpMSA9IGRlbGV0ZWRMaXN0Lmxlbmd0aDsgaTEgPCBhZGRlZExpc3QubGVuZ3RoOyBpMSsrKXtcbiAgICAgICAgICAgICAgICB5aWVsZCBhZGRlZExpc3RbaTFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGFkZGVkTGlzdC5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgeWllbGQgbWFrZVJlcGxhY2VkKGFkZGVkTGlzdFtpXSwgZGVsZXRlZExpc3RbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yKGxldCBpMSA9IGFkZGVkTGlzdC5sZW5ndGg7IGkxIDwgZGVsZXRlZExpc3QubGVuZ3RoOyBpMSsrKXtcbiAgICAgICAgICAgICAgICB5aWVsZCBkZWxldGVkTGlzdFtpMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWRkZWRMaXN0ID0gW107XG4gICAgICAgIGRlbGV0ZWRMaXN0ID0gW107XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2hhbmdlIG9mIGNoYW5nZXMpe1xuICAgICAgICBzd2l0Y2goY2hhbmdlLnR5cGUpe1xuICAgICAgICAgICAgY2FzZSBcImFkZGVkXCI6XG4gICAgICAgICAgICAgICAgYWRkZWRMaXN0LnB1c2goY2hhbmdlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJkZWxldGVkXCI6XG4gICAgICAgICAgICAgICAgZGVsZXRlZExpc3QucHVzaChjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImNvbW1vblwiOlxuICAgICAgICAgICAgICAgIHlpZWxkKiBmbHVzaCgpO1xuICAgICAgICAgICAgICAgIHlpZWxkIGNoYW5nZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICB5aWVsZCogZmx1c2goKTtcbn1cbmZ1bmN0aW9uIG1ha2VSZXBsYWNlZChsZWZ0LCByaWdodCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBsZWZ0LnZhbHVlLFxuICAgICAgICBvbGRWYWx1ZTogcmlnaHQudmFsdWUsXG4gICAgICAgIHR5cGU6IFwicmVwbGFjZWRcIlxuICAgIH07XG59XG5mdW5jdGlvbiogcmV2ZXJzZShsaXN0KSB7XG4gICAgZm9yKGxldCBpID0gbGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7XG4gICAgICAgIHlpZWxkIGxpc3RbaV07XG4gICAgfVxufVxuZnVuY3Rpb24qIGRpZmZUb0NoYW5nZXMobGVmdCwgcmlnaHQsIHsgdXNlcklkICB9KSB7XG4gICAgY29uc3QgeyBidWlsZFNFUyAgfSA9IGRpZmYobGVmdC5tYXAoKHsgdGV4dCAgfSk9PnRleHRcbiAgICApLCByaWdodCk7XG4gICAgbGV0IGxpbmVObyA9IDA7XG4gICAgbGV0IGxpbmVJZCA9IGxlZnRbMF0uaWQ7XG4gICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgdG9FeHRlbmRlZENoYW5nZXMoYnVpbGRTRVMoKSkpe1xuICAgICAgICBzd2l0Y2goY2hhbmdlLnR5cGUpe1xuICAgICAgICAgICAgY2FzZSBcImFkZGVkXCI6XG4gICAgICAgICAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0OiBsaW5lSWQsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogY3JlYXRlTmV3TGluZUlkKHVzZXJJZCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjaGFuZ2UudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjYXNlIFwiZGVsZXRlZFwiOlxuICAgICAgICAgICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgICAgICAgICAgX2RlbGV0ZTogbGluZUlkLFxuICAgICAgICAgICAgICAgICAgICBsaW5lczogLTFcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJlcGxhY2VkXCI6XG4gICAgICAgICAgICAgICAgeWllbGQge1xuICAgICAgICAgICAgICAgICAgICBfdXBkYXRlOiBsaW5lSWQsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjaGFuZ2UudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbGluZU5vKys7XG4gICAgICAgIGxpbmVJZCA9IGxlZnRbbGluZU5vXT8uaWQgPz8gXCJfZW5kXCI7XG4gICAgfVxufVxuYXN5bmMgZnVuY3Rpb24gam9pblBhZ2VSb29tKHByb2plY3QsIHRpdGxlKSB7XG4gICAgY29uc3QgW3sgcGFnZUlkICwgY29tbWl0SWQ6IGluaXRpYWxDb21taXRJZCAsIHBlcnNpc3RlbnQgIH0sIHByb2plY3RJZCwgdXNlcklkXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2V0UGFnZUlkQW5kQ29tbWl0SWQocHJvamVjdCwgdGl0bGUpLFxuICAgICAgICBnZXRQcm9qZWN0SWQocHJvamVjdCksXG4gICAgICAgIGdldFVzZXJJZCgpLCBcbiAgICBdKTtcbiAgICBsZXQgcGFyZW50SWQgPSBpbml0aWFsQ29tbWl0SWQ7XG4gICAgbGV0IGNyZWF0ZWQgPSBwZXJzaXN0ZW50O1xuICAgIGNvbnN0IGlvID0gYXdhaXQgc29ja2V0SU8oKTtcbiAgICBjb25zdCB7IHJlcXVlc3QgLCByZXNwb25zZSAgfSA9IHdyYXAoaW8pO1xuICAgIGF3YWl0IHJlcXVlc3QoXCJzb2NrZXQuaW8tcmVxdWVzdFwiLCB7XG4gICAgICAgIG1ldGhvZDogXCJyb29tOmpvaW5cIixcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgICAgcHJvamVjdFVwZGF0ZXNTdHJlYW06IGZhbHNlXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAoYXN5bmMgKCk9PntcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCB7IGlkICB9IG9mIHJlc3BvbnNlKFwiY29tbWl0XCIpKXtcbiAgICAgICAgICAgIHBhcmVudElkID0gaWQ7XG4gICAgICAgIH1cbiAgICB9KSgpO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHB1c2goY2hhbmdlcywgcmV0cnkgPSAzKSB7XG4gICAgICAgIGlmICghY3JlYXRlZCkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcHVzaENvbW1pdChyZXF1ZXN0LCBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYXJlbnRJZCA9IHJlcy5jb21taXRJZDtcbiAgICAgICAgICAgIGNyZWF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudElkID0gYXdhaXQgcHVzaFdpdGhSZXRyeShyZXF1ZXN0LCBjaGFuZ2VzLCB7XG4gICAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICAgIHByb2plY3RJZCxcbiAgICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgIHByb2plY3QsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIHJldHJ5XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBpbnNlcnQ6IGFzeW5jICh0ZXh0LCBiZWZvcmVJZCA9IFwiX2VuZFwiKT0+e1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRleHQuc3BsaXQoL1xcbnxcXHJcXG4vKS5tYXAoKGxpbmUpPT4oe1xuICAgICAgICAgICAgICAgICAgICBfaW5zZXJ0OiBiZWZvcmVJZCxcbiAgICAgICAgICAgICAgICAgICAgbGluZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogY3JlYXRlTmV3TGluZUlkKHVzZXJJZClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgcHVzaChjaGFuZ2VzKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlOiAobGluZUlkKT0+cHVzaChbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBfZGVsZXRlOiBsaW5lSWQsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzOiAtMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0pXG4gICAgICAgICxcbiAgICAgICAgdXBkYXRlOiAodGV4dCwgbGluZUlkKT0+cHVzaChbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBfdXBkYXRlOiBsaW5lSWQsXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdKVxuICAgICAgICAsXG4gICAgICAgIHBhdGNoOiBhc3luYyAodXBkYXRlKT0+e1xuICAgICAgICAgICAgY29uc3Qgb2xkTGluZXMgPSAoYXdhaXQgZ2V0UGFnZShwcm9qZWN0LCB0aXRsZSkpLmxpbmVzO1xuICAgICAgICAgICAgY29uc3QgbmV3TGluZXMgPSB1cGRhdGUob2xkTGluZXMpO1xuICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IFtcbiAgICAgICAgICAgICAgICAuLi5kaWZmVG9DaGFuZ2VzKG9sZExpbmVzLCBuZXdMaW5lcywge1xuICAgICAgICAgICAgICAgICAgICB1c2VySWRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGF3YWl0IHB1c2goY2hhbmdlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIGxpc3RlblBhZ2VVcGRhdGU6ICgpPT5yZXNwb25zZShcImNvbW1pdFwiKVxuICAgICAgICAsXG4gICAgICAgIGNsZWFudXA6ICgpPT5pby5kaXNjb25uZWN0KClcbiAgICB9O1xufVxuYXN5bmMgZnVuY3Rpb24gcHVzaENvbW1pdChyZXF1ZXN0LCBjaGFuZ2VzLCB7IHByb2plY3RJZCAsIHBhZ2VJZCAsIHVzZXJJZCAsIHBhcmVudElkICB9KSB7XG4gICAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSByZXR1cm4ge1xuICAgICAgICBjb21taXRJZDogcGFyZW50SWRcbiAgICB9O1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlcXVlc3QoXCJzb2NrZXQuaW8tcmVxdWVzdFwiLCB7XG4gICAgICAgIG1ldGhvZDogXCJjb21taXRcIixcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAga2luZDogXCJwYWdlXCIsXG4gICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICAgIHBhZ2VJZCxcbiAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgICBjdXJzb3I6IG51bGwsXG4gICAgICAgICAgICBmcmVlemU6IHRydWVcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG59XG5hc3luYyBmdW5jdGlvbiBwdXNoV2l0aFJldHJ5KHJlcXVlc3QsIGNoYW5nZXMsIHsgcHJvamVjdElkICwgcGFnZUlkICwgdXNlcklkICwgcGFyZW50SWQgLCBwcm9qZWN0ICwgdGl0bGUgLCByZXRyeSA9MyAgfSkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHB1c2hDb21taXQocmVxdWVzdCwgY2hhbmdlcywge1xuICAgICAgICAgICAgcGFyZW50SWQsXG4gICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICBwYWdlSWQsXG4gICAgICAgICAgICB1c2VySWRcbiAgICAgICAgfSk7XG4gICAgICAgIHBhcmVudElkID0gcmVzLmNvbW1pdElkO1xuICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiRmFpbGQgdG8gcHVzaCBhIGNvbW1pdC4gUmV0cnkgYWZ0ZXIgcHVsbGluZyBuZXcgY29tbWl0c1wiKTtcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHJldHJ5OyBpKyspe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXJlbnRJZCA9IChhd2FpdCBnZXRQYWdlSWRBbmRDb21taXRJZChwcm9qZWN0LCB0aXRsZSkpLmNvbW1pdElkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHB1c2hDb21taXQocmVxdWVzdCwgY2hhbmdlcywge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgICAgICBwYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHBhcmVudElkID0gcmVzLmNvbW1pdElkO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3VjY2VzcyBpbiByZXRyeWluZ1wiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRXJyb3IoXCJGYWlsZCB0byByZXRyeSBwdXNoaW5nLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmVudElkO1xufVxuZnVuY3Rpb24gdGhyb3R0bGUoY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgICBjb25zdCB7IHRyYWlsaW5nID1mYWxzZSAgfSA9IG9wdGlvbnMgPz8ge1xuICAgIH07XG4gICAgbGV0IHF1ZXVlO1xuICAgIGxldCBydW5uaW5nID0gZmFsc2U7XG4gICAgY29uc3QgY2FuY2VsID0gKCk9PnF1ZXVlPy5yZXNvbHZlPy4oe1xuICAgICAgICAgICAgZXhlY3V0ZWQ6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgO1xuICAgIGNvbnN0IHJ1bk5leHQgPSBhc3luYyAoKT0+e1xuICAgICAgICBpZiAocnVubmluZyB8fCAhcXVldWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBydW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgeyBwYXJhbWV0ZXJzICwgcmVzb2x2ZSAsIHJlamVjdCAgfSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhbGxiYWNrKC4uLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgIGV4ZWN1dGVkOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcnVubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9IGZpbmFsbHl7XG4gICAgICAgICAgICBpZiAodHJhaWxpbmcpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBydW5OZXh0KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gKC4uLnBhcmFtZXRlcnMpPT5uZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+e1xuICAgICAgICAgICAgcXVldWU/LnJlc29sdmU/Lih7XG4gICAgICAgICAgICAgICAgZXhlY3V0ZWQ6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHF1ZXVlID0ge1xuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICByZWplY3RcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBydW5OZXh0KCk7XG4gICAgICAgIH0pXG4gICAgO1xufVxuY29uc3QgcHJvamVjdCA9IFwidGFra2VyXCI7XG5jb25zdCB0aXRsZSA9IFwiXHU1REVFXHU1MjA2XHU2NkY4XHUzMDREXHU4RkJDXHUzMDdGXHUzMEM2XHUzMEI5XHUzMEM4XHU3NTI4XHUzMERBXHUzMEZDXHUzMEI4XCI7XG5jb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuY29uc3Qgc2hhZG93Um9vdCA9IGRpdi5hdHRhY2hTaGFkb3coe1xuICAgIG1vZGU6IFwib3BlblwiXG59KTtcbnNoYWRvd1Jvb3QuaW5uZXJIVE1MID0gYFxuICA8c3R5bGU+XG4gICAgOmhvc3Qge1xuICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICBsZWZ0OiAwO1xuICAgICAgIGJvdHRvbTogMDtcbiAgICAgICB6LWluZGV4OiA5OTk5O1xuICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYWdlLWJnKTtcbiAgICAgICBjb2xvcjogdmFyKC0tcGFnZS10ZXh0LWNvbG9yKTtcbiAgICAgICBib3JkZXI6IHNvbGlkIDFweCB2YXIoLS10ZWxvbWVyZS11bnJlYWQpO1xuICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICBwYWRkaW5nOiA4cHg7XG4gICAgICAgbWFyZ2luOiAxMHB4O1xuICAgIH1cbiAgICBidXR0b24ge1xuICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICB9XG4gIDwvc3R5bGU+XG4gIDxkaXY+XG4gICAgPGJ1dHRvbiBpZD1cImJ1dHRvblwiPng8L2J1dHRvbj5cbiAgICA8c3BhbiBpZD1cInRpdGxlXCI+PC9zcGFuPlxuICA8L2Rpdj5cbiAgPHRleHRhcmVhIGlkPVwiZWRpdG9yXCI+PC90ZXh0YXJlYT5cbmA7XG5kb2N1bWVudC5ib2R5LmFwcGVuZChkaXYpO1xuY29uc3QgeyBwYXRjaCAsIGNsZWFudXAgIH0gPSBhd2FpdCBqb2luUGFnZVJvb20ocHJvamVjdCwgdGl0bGUpO1xuY29uc29sZS5pbmZvKFwiQ29ubmVjdGVkIHRvIHNjcmFwYm94LmlvXCIpO1xuY29uc3QgZWRpdG9yID0gc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZChcImVkaXRvclwiKTtcbmNvbnN0IHVwZGF0ZSA9ICh0ZXh0KT0+cGF0Y2goKFt0aXRsZUxpbmVdKT0+W1xuICAgICAgICAgICAgdGl0bGVMaW5lLnRleHQsXG4gICAgICAgICAgICAuLi50ZXh0LnNwbGl0KC9cXG58XFxyXFxuLylcbiAgICAgICAgXVxuICAgIClcbjtcbmNvbnN0IGNhbGxiYWNrID0gdGhyb3R0bGUodXBkYXRlLCB7XG4gICAgdHJhaWxpbmc6IHRydWVcbn0pO1xuZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCAoKT0+Y2FsbGJhY2soZWRpdG9yLnZhbHVlKVxuKTtcbmNvbnNvbGUuaW5mbyhcIlN0YXJ0IHBhdGNoaW5nXCIpO1xuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZChcInRpdGxlXCIpLmluc2VydEFkamFjZW50SFRNTChcImJlZm9yZWVuZFwiLCBgPGEgaHJlZj1cIiR7YC8ke3Byb2plY3R9LyR7dGl0bGV9YH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2AvJHtwcm9qZWN0fS8ke3RpdGxlfWB9PC9hPmApO1xuc2hhZG93Um9vdC5nZXRFbGVtZW50QnlJZChcImJ1dHRvblwiKS5vbmNsaWNrID0gKCk9PntcbiAgICBjb25zb2xlLmluZm8oXCJFbmQgcGF0Y2hpbmdcIik7XG4gICAgY2xlYW51cCgpO1xuICAgIGRpdi5yZW1vdmUoKTtcbn07XG5cbiJdLAogICJtYXBwaW5ncyI6ICJBQUFBLEtBQU0sU0FBVSxRQUNoQix5QkFBMEIsQ0FFdEIsTUFBTyxBQURJLE1BQU0sbUJBQ1Asc0JBQXVCLENBQzdCLGtCQUFtQixJQUNuQixXQUFZLENBQ1IsZUFJWix5QkFBMEIsQ0FDdEIsS0FBTSxHQUFNLG9EQUFvRCwyQkFDaEUsR0FBSSxTQUFTLGNBQWMsZUFBZSxPQUN0QyxNQUFPLFNBQVEsUUFBUSxPQUFPLElBRWxDLEtBQU0sR0FBUyxTQUFTLGNBQWMsVUFDdEMsU0FBTyxJQUFNLEVBQ04sR0FBSSxTQUFRLENBQUMsRUFBUyxJQUFTLENBQ2xDLEVBQU8sT0FBUyxJQUFJLEVBQVEsT0FBTyxJQUVuQyxFQUFPLFFBQVUsQUFBQyxHQUFJLEVBQU8sR0FF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